# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
import json
from pymongo import MongoClient


class MyPipeline(object):

    def process_item(self, item, spider):
        """
        处理数据
        :param item:
        :param spider:
        :return:
        """
        return item


# 保存的MongoDB数据库的管道
class MongoPipeline(object):
    # 爬虫开启时执行一次
    def open_spider(self, spider):
        # spider对象.属性 == 爬虫名字
        if spider.name == "teacher":
            con = MongoClient()
            self.collection = con.itcast.teacher

    def process_item(self, item, spider):
        if spider.name == "teacher":
            self.collection.insert(dict(item))
        return item


# 保存到文件的管道
class ItcastPipeline:
    def open_spider(self, spider):
        """
        在爬虫开启的时候只执行一次
        :param spider: 爬虫对象
        :return:
        """
        if spider.name == "teacher":
            self.f = open("file_html/teacher.json", "a", encoding='utf-8')

    # 爬虫文件中提取数据的方法每yield一次item,就会运行一次
    # 该方法为固定名称函数
    def process_item(self, item, spider):
        """
        保存数据(处理爬虫中传递过来的数据方法)
            利用管道pipeline来处理(保存)数据

        定义对数据的操作:
            定义一个管道类
            重写管道类的process_item方法
            process_item方法处理完item之后必须返回给引擎
        :param item: 要处理的数据
        :param spider: 当前传递数据过来的爬虫对象
        :return:
        """
        # process_item(self,item,spider):管道类中必须有的函数
        # 实现对item数据的处理
        # 必须return item

        if spider.name == "teacher":
            self.f.write(json.dumps(dict(item), ensure_ascii=False, indent=2) + ",\n")

        return item

    def close_spider(self, spider):
        """
        在爬虫关闭的时候只执行一次
        :param spider:
        :return: 爬虫对象
        """
        if spider.name == "teacher":
            self.f.close()
